class Left {
  static of(value) {
    return new Left(value)
  }
  constructor(value) {
    this._value = value
  }
  map(fn) {
    // left 直接返回对象
    return this
  }
}

class Right {
  static of(value) {
    return new Right(value)
  }
  constructor(value) {
    this._value = value
  }
  map(fn) {
    return Right.of(fn(this._value))
  }
}

let r1 = Right.of(12).map((x) => x + 2)
// .map((x) => x * 2)
let l1 = Left.of(12).map((x) => x + 2)
// .map((x) => x * 2)
console.log(r1, l1)
// Right { _value: 28 } Left { _value: 12 }
// Right { _value: 14 } Left { _value: 12 }
function parseJSON(str) {
  try {
    // 字符串转化成为JSON对象用JSON.parse
    return Right.of(JSON.parse(str))
  } catch (e) {
    // e.message 记录信息
    return Left.of({ error: e.message })
  }
}

let r2 = parseJSON('{name: zs}')
console.log(r2)
// Left { _value: { error: 'Unexpected token n in JSON at position 1' } }
let r3 = parseJSON('{"name": "zs"}').map((x) => x.name.toUpperCase())
console.log(r3)
// Right { _value: 'ZS' }
